package com.study.compose.coroutines

import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

/**
 * 组合挂起函数
 * 我们假设在某个位置定义了用于执行耗时操作的两个挂起函数，在主函数中调用他们，
 * 示例定义两个挂起函数，并返回计算结果
 */

suspend fun doSomethingOne(): String {
    delay(1000)
    return "任务一"
}

suspend fun doSomethingTwo(): String {
    delay(1000)
    return "任务二"
}

/**
 * 主函数
 */
fun main() = runBlocking<Unit> {

    /**
     * 按顺序执行，measureTimeMillis函数计算代码块中的程序执行的时间
     */
    val timeOne = measureTimeMillis {
        val resOne = doSomethingOne()
        println(resOne)
        val resTwo = doSomethingTwo()
        println(resTwo)
    }

    println("执行时间:${timeOne}")

    /**
     * 并发执行
     */
    val timeTwo = measureTimeMillis {
        //使用async代码块表示并发执行
        val resOne = async { doSomethingOne() }
        val resTwo = async { doSomethingTwo() }

        //使用await()等待其结果
        println(resOne.await())
        println(resTwo.await())
    }

    println("执行时间:${timeTwo}")
}
